# -*-coding:utf-8-*-
import re
from LAC import LAC
from ddparser import DDParser
import pkuseg

'''
2022.6.17
LAC默认模型分词 粒度太大 如：我没有钱---> 我没有  钱
换用北大分词工具 pkuseg
分析"有"字句的句法结构
一般情形：“有/没有/还有……”作为HED，SBV或VOB作为修饰
特殊情形：其他动词或形容词作为HED  ”有“作为ADV\VOB修饰HED
'''

ddp = DDParser()
pkuseg = pkuseg.pkuseg()
lac = LAC()

'''
找'有'的关键词
'''
def find_key(sentence):
    # 正则表达式寻找关键字 确定句子中含“有”和“是”
    pattern_1 = re.compile(r'[\u6709]')  # 有
    pattern_2 = re.compile(r'[\u662f]')  # 是
    if re.findall(pattern_1, sentence) or re.findall(pattern_2, sentence):
        return sentence
    return ""

def find_hed(text):
    sentences = re.split(r"[。；：，！？]", text)
    for sent in sentences:
        sent = find_key(sent)
        if sent == "":
            continue
        print("*" * 100)
        print(sent)
        pkures = pkuseg.cut(sent)
        ddpres = ddp.parse_seg([pkures])
        lacres = lac.run(pkures)        # 根据pkuseg分词结果词性标注
        print(pkures)
        print(ddpres)
        print(lacres)

        hed_num = -1    # hed在词表中的位置，从1算起
        for i in range(len(pkures)):
            if ddpres[0]["deprel"][i] == "HED":
                hed_num = i + 1
        hed_info = [{"word": ddpres[0]["word"][hed_num - 1], "num": hed_num, "deprel": ddpres[0]["deprel"][hed_num - 1]}]   # HED信息
        sbv_info,vob_info,adv_info,att_info = find_hedmodifi(pkures, ddpres, hed_info,lacres)
        print('hed_info：',hed_info)
        print('sbv_info：',sbv_info)
        print('vob_info：',vob_info)
        print('adv_info：',adv_info)
        print('att_info：',att_info)
        if judge_type(hed_info, sbv_info, vob_info, adv_info,att_info):
            if re.findall(re.compile(r'[\u6709]'), sent):
                print("此句是'有'字句")
            if re.findall(re.compile(r'[\u662f]'), sent):
                print("此句是'是'字句")




def find_hedmodifi(pkures,ddpres,hed_info,lacres):
    # 查找是否有修饰HED的SBV和VOB 或  修饰其他-HED的”有“-ADV
    deprel = ddpres[0]['deprel']
    sbv_info = []
    vob_info = []
    adv_info = []       # 修饰HED的ADV-”有/是“
    att_info = []
    for i in range(len(pkures)):
        if deprel[i] == 'SBV' and ddpres[0]['head'][i] == hed_info[0]['num']:
            sbv_info.append({'word': ddpres[0]['word'][i], 'pos':lacres[i][1][0], 'deprel':ddpres[0]['deprel'][i], 'hed_word':hed_info[0]['word']})      # idx是词在分词列表中的索引，从0开始
        if deprel[i] == 'VOB' and ddpres[0]['head'][i] == hed_info[0]['num']:
            vob_info.append({'word': ddpres[0]['word'][i], 'pos':lacres[i][1][0], 'deprel':ddpres[0]['deprel'][i], 'hed_word':hed_info[0]['word']})
        if deprel[i] == 'ADV' and ddpres[0]['head'][i] == hed_info[0]['num']:
            adv_info.append({'word': ddpres[0]['word'][i], 'pos':lacres[i][1][0], 'deprel':ddpres[0]['deprel'][i], 'hed_word':hed_info[0]['word']})
    if vob_info:
        for i in range(len(pkures)):
            if deprel[i] == 'ATT' and ddpres[0]['word'][ddpres[0]['head'][i] - 1] == vob_info[0]['word']:
                att_info.append({'word': ddpres[0]['word'][i], 'pos':lacres[i][1][0], 'deprel': ddpres[0]['deprel'][i],
                                 'hed_word': ddpres[0]['word'][(ddpres[0]['head'][i]) - 1]})  # 修饰宾语的定语
    return sbv_info,vob_info,adv_info,att_info

def judge_type(hed_info,sbv_info,vob_info,adv_info,att_info):
    type_lst = ['主||“（没）有”+宾', '主||“（没）有”+数量词组', '主||“有”+“多（么）”+形/动', '主||状[“都/也”]+“（没）有"',
                '主||”是“+名/代/名词词组', '主||”是“+形/形容词词组', '主||”是“+动/动词词组', '主||”是“+数量词组', '主||”是“+主谓词组', '主||”是“+介宾词组', '主||”是“+"的"字词组']
    noun_lst = ['n', 'f', 's', 't', 'nr', 'ns', 'nt', 'nw', 'nz', 'r']
    verb_lst = ['v', 'vd', 'vn']
    adj_lst = ['a', 'ad', 'an']
    # 第一种情形 “有/是”作为HED 寻找修饰“有/是”的SBV或VOB
    if re.findall(re.compile(r'[\u6709]'), hed_info[0]['word']) == '有' and (sbv_info or vob_info):
        if att_info:
            for att in att_info:
                if att['pos'] == 'q':
                    type_id = 1
                    break
        elif adv_info:
            for adv in adv_info:
                if adv['pos'] == 'd' and adv['hed_word'] == hed_info[0]['head']:
                    type_id =  3
                    break
    if re.findall(re.compile(r'[\u662f]'), hed_info[0]['word']) == '是' and (sbv_info or vob_info):
        if vob_info['pos'] in noun_lst:
            type_id = 4
        elif vob_info['pos'] in adj_lst:
            type_id = 5
        elif vob_info['pos'] in verb_lst:
            type_id = 6
        elif att_info:
            for att in att_info:
                if att['pos'] == 'q':
                    type_id = 7
                    break
    # 第二种情形 其他动词或形容词作为HED  寻找作为ADV或VOB的”有“
    elif [find_key(adv['word']) for adv in adv_info] or find_key(vob_info[0]['word']):
        return True
    else:
        return False
    # print('句子类型：' + type_lst[type_id])
def analysis_type(hed_info,sbv_info,vob_info,adv_info,att_info):
    '''句型解析：
    “有”字句
    主||“有”+宾
    主||“没”（+“有”）+宾
    主||“有”+数量词组
    主||“没”+“有”+数量词组
    主||“有”+“多（么）”+形/动
    主||状[“都/也”]（+“没”）+“有”
    主||主+状[“都/也”]（+“没”）+“有”
    ”是“字句
    主||“是”+名/代/名词词组
    主||“是”+数量词组
    主[处所词]||“是”+名
    主||“是”+形/形容词词组
    主||“是”+动/动词词组
    主||“是”+主谓词组
    主||“是”+介宾词组
    主||“是”+“的”字词组'''
    type_lst = ['主||“（没）有”+宾', '主||“（没）有”+数量词组',\
                '主||“有”+“多（么）”+形/动', '主||状[“都/也”]+“（没）有"']
    print(hed_info[0]['word'])






if __name__ == '__main__':
    #text = '家里有老人。我没有问题。这里有一百朵花。电子科大没有十个傻子。他有多可恶。我也没有钱。老师同学都没有死。'
    text = '咱们有枪，不怕他。木莲有莲房一般的果实。树上有两只鸟在叫'       # 主||“有”+宾
    #text = '我没有戒指，我也没有钱，我还没有车，我更没有房，你愿意嫁给我吗？'     # 主||“没” + “有” + 宾
    #text = '今天有二十几度吧。每一个时代都有很多特殊的人，人人都有一双手。我有一表侄，他有三十来岁吧。'     # 主||“有”+数量词组（+形）
    #text = '参加会议的没有那么多人，他没有我大吧'    # 主||“没”+“有”+数量词组（+形）
    #text = '国王有那么多奢靡的珍宝，从不肯分给百姓一些。昨晚没睡好，今早起来有点头晕。鲁迅没有那么激昂的笔触很难表达出那个时代真正的情感。你有去过日本吗？'
    #text = '蔬菜也有，水果也有，他哪有我大呀。上天都有好生之德。涉案人员都没有据实上报孙小果案件的实情。我也没干什么过分的事呀。'        # 主||状[“都/也”]（+“没”）+“有”
    #text = '做任何事都要有恒心。他身体不好，感觉有一段时间了，这些新兵有的是工人，有的是社员。'      # 特殊
    text = '他没有我大。昨晚没睡好，今早起来有点头晕。鲁迅没有那么激昂的笔触很难表达出那个时代真正的情感。你有去过日本吗？他哪有我大呀！他身体不好，感觉有一段时间了。孙小果有多么可恶。' \
           '一年是365天。她是近视眼。这件衣服是挺好看的。你今天又迟到了，是什么原因？今天是没赶上第一班车。'    # 特殊
    text = '木莲有成千上万个果实。树上有两只鸟在叫。我也没有梦想。他们都有理想。'
    find_hed(text)
